package frsf.cidisi.exercise.laberinto.search.util;

public class Orientacion {
	private Par orientacion;
	
	private static Par NORTE = new Par(-1, 0); 
	private static Par ESTE  = new Par( 0, 1);
	private static Par SUR   = new Par( 1, 0);
	private static Par OESTE = new Par( 0,-1);

	//Constructor por defecto: el agente comienza mirando hacia el Este.
	public Orientacion() {
		this.setOrientacion(ESTE);
	}
	
	public Orientacion(Par unaOrientacion) {
		this.setOrientacion(unaOrientacion);
	}
	
	public Par getOrientacion() {
		return orientacion;
	}
	
	public void setOrientacion(Par unaOrientacion) {
		if(unaOrientacion.equals(NORTE) || unaOrientacion.equals(ESTE) ||
		   unaOrientacion.equals(SUR) || unaOrientacion.equals(OESTE))
		orientacion = unaOrientacion;
	}

	public Orientacion girarDerecha() {
		Par nuevaOrient = new Par();
		nuevaOrient.setX(orientacion.getY());
		nuevaOrient.setY(-1*orientacion.getX());
		return new Orientacion(nuevaOrient);
	}
	
	public Orientacion girarIzquierda() {
		Par nuevaOrient = new Par();
		nuevaOrient.setX(-1*orientacion.getY());
		nuevaOrient.setY(orientacion.getX());
		return new Orientacion(nuevaOrient);
	}
	
	public boolean orientacionDeSalida() {
		return orientacion.equals(ESTE);
	}
	
	public int getDireccion() {
		if(orientacion.equals(NORTE))
			return Celda.getNorte();
		if(orientacion.equals(ESTE))
			return Celda.getEste();
		if(orientacion.equals(SUR))
			return Celda.getSur();
		return Celda.getOeste();
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Orientacion other = (Orientacion) obj;
		if (orientacion == null) {
			if (other.orientacion != null)
				return false;
		} else if (!orientacion.equals(other.orientacion))
			return false;
		return true;
	}
	
	public Object clone() {
		return new Orientacion((Par) orientacion.clone());
	}
	
	public String toString() {
		if(orientacion.equals(NORTE))
			return "NORTE";
		if(orientacion.equals(ESTE))
			return "ESTE";
		if(orientacion.equals(SUR))
			return "SUR";
		return "OESTE";
	}
}
